{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "2f4f0ea2-bc93-402a-b2d5-437c7e7b2c63",
   "metadata": {},
   "source": [
    "# Serialization speed of Python bytes\n",
    "\n",
    "In this example, we measure how much time it takes to serialize up to 1GB of random bytes, repeating the test 10 times. The type of the serialized Python variable has type `bytes`. Interesting fact: [SQLite is faster than writing directly to filesystem](https://www.sqlite.org/fasterthanfs.html).\n",
    "\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "7440aa9f-ae50-440e-b682-253c3db1405d",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-02-13T21:06:02.269645Z",
     "iopub.status.busy": "2024-02-13T21:06:02.268973Z",
     "iopub.status.idle": "2024-02-13T21:07:04.575791Z",
     "shell.execute_reply": "2024-02-13T21:07:04.575320Z"
    }
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "6646b8c3cafb4e8684eb4d3e9ee9bd9a",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  1%|1         | 1/100 [00:05<08:19,  5.04s/it]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Runs(keys(100)=[\"51d85704-bdf8-4ff0-88e6-25e2bd114d0f\", \"c88fbd97-a2da-47ac-82a6-833ec21bfaf3\", \"a8fb01d9-e33c-4866-a1a8-b1d24afef9e7\", \"734b3d60-6b35-4f9e-82d1-00db99a5d683\", \"a780c12f-4688-459f-b3ae-9dbb1d9322cc\", ...])"
      ],
      "text/plain": [
       "{UUID('51d85704-bdf8-4ff0-88e6-25e2bd114d0f'): <mltraq.run.Run at 0x137383a00>,\n",
       " UUID('c88fbd97-a2da-47ac-82a6-833ec21bfaf3'): <mltraq.run.Run at 0x1373838b0>,\n",
       " UUID('a8fb01d9-e33c-4866-a1a8-b1d24afef9e7'): <mltraq.run.Run at 0x137383920>,\n",
       " UUID('734b3d60-6b35-4f9e-82d1-00db99a5d683'): <mltraq.run.Run at 0x137383990>,\n",
       " UUID('a780c12f-4688-459f-b3ae-9dbb1d9322cc'): <mltraq.run.Run at 0x137383a70>,\n",
       " UUID('f020c712-7d48-4053-acab-8b03858e82c5'): <mltraq.run.Run at 0x137383ae0>,\n",
       " UUID('2fd34c74-2e78-4aa1-a1ee-2c6a12ad7b64'): <mltraq.run.Run at 0x137383b50>,\n",
       " UUID('3027b93f-f5a3-49cd-b18c-4d64a9d4fe8c'): <mltraq.run.Run at 0x137383bc0>,\n",
       " UUID('2dffcc5d-90b0-497a-8848-f7e4323d92c5'): <mltraq.run.Run at 0x137383c30>,\n",
       " UUID('c2b63e1b-e505-4124-bbd1-89304a77c8c2'): <mltraq.run.Run at 0x137383ca0>,\n",
       " UUID('3e1e18be-dfdc-48ac-87d2-c4abc0bc9236'): <mltraq.run.Run at 0x137383d10>,\n",
       " UUID('582c8135-c55a-4c56-81f4-ebb46fa175ce'): <mltraq.run.Run at 0x137383d80>,\n",
       " UUID('32286d0a-c259-480f-980d-9aed7061a77b'): <mltraq.run.Run at 0x137383df0>,\n",
       " UUID('da7272f6-139a-416d-973f-346669314114'): <mltraq.run.Run at 0x137383e60>,\n",
       " UUID('1663f7c3-6f3e-4520-b700-29075909472c'): <mltraq.run.Run at 0x137383ed0>,\n",
       " UUID('d7b6b484-31f7-4068-85cc-801fd40fe990'): <mltraq.run.Run at 0x137383f40>,\n",
       " UUID('049f1845-6578-49d9-8369-9bc81a920de5'): <mltraq.run.Run at 0x1373ec040>,\n",
       " UUID('6076c392-05f2-46ab-ac61-16757f99393c'): <mltraq.run.Run at 0x1373ec0b0>,\n",
       " UUID('73999eea-e449-4e62-a3bc-18b47933da8b'): <mltraq.run.Run at 0x1373ec120>,\n",
       " UUID('e5befc2e-0ba3-4b40-9502-028bca9248b4'): <mltraq.run.Run at 0x1373ec190>,\n",
       " UUID('90c0d1be-48a3-4ef5-ae76-e4a43187d074'): <mltraq.run.Run at 0x1373ec200>,\n",
       " UUID('e21de112-b82d-4267-85df-4b09e0b2c3cc'): <mltraq.run.Run at 0x1373ec270>,\n",
       " UUID('667b72cc-4886-427a-9350-3637f1132334'): <mltraq.run.Run at 0x1373ec2e0>,\n",
       " UUID('d969d49c-27bb-41fb-9b1c-b9717868524d'): <mltraq.run.Run at 0x1373ec350>,\n",
       " UUID('d2575201-bfe2-476d-836e-a57e9510f5df'): <mltraq.run.Run at 0x1373ec3c0>,\n",
       " UUID('c106ee44-c1fd-44b3-95ee-dfd1a91e0304'): <mltraq.run.Run at 0x1373ec430>,\n",
       " UUID('8fa5efca-301c-44c1-a257-37c079de64ed'): <mltraq.run.Run at 0x1373ec4a0>,\n",
       " UUID('b7cb3a99-8f79-429d-ac1f-d90c27bd76f1'): <mltraq.run.Run at 0x1373ec510>,\n",
       " UUID('8584b7f6-ee48-496a-920e-13f8f73d7ae2'): <mltraq.run.Run at 0x1373ec580>,\n",
       " UUID('03ab105c-abca-43c8-9633-aa0857f95914'): <mltraq.run.Run at 0x1373ec5f0>,\n",
       " UUID('7a9b8f57-f7f3-41ec-958f-edd60cdaecbb'): <mltraq.run.Run at 0x1373ec660>,\n",
       " UUID('d1b86258-76c7-478f-9a46-063cf623249a'): <mltraq.run.Run at 0x1373ec6d0>,\n",
       " UUID('eadccc8f-0ba7-4992-a93a-7a60d8053bb0'): <mltraq.run.Run at 0x1373ec740>,\n",
       " UUID('b89c5de7-584e-4b25-9067-d615d397c6a8'): <mltraq.run.Run at 0x1373ec7b0>,\n",
       " UUID('b55865d2-2076-463c-90ac-4ab11a0c8792'): <mltraq.run.Run at 0x1373ec820>,\n",
       " UUID('0e402383-d145-4aab-9837-e1a2f807de74'): <mltraq.run.Run at 0x1373ec890>,\n",
       " UUID('f867ffa9-9eef-4612-aa08-1ee35bd6cde0'): <mltraq.run.Run at 0x1373ec900>,\n",
       " UUID('a8d8f626-cad5-41f8-b6a7-71a38593d835'): <mltraq.run.Run at 0x1373ec970>,\n",
       " UUID('4bd98cac-215b-40f3-b38e-c9497c518242'): <mltraq.run.Run at 0x1373ec9e0>,\n",
       " UUID('2ccb7f70-7250-4098-b847-6f1b62d96420'): <mltraq.run.Run at 0x1373eca50>,\n",
       " UUID('2a5b4058-60df-463a-8cda-cac95f8f89be'): <mltraq.run.Run at 0x1373ecac0>,\n",
       " UUID('96b63064-08e5-47a6-a488-246c88d20242'): <mltraq.run.Run at 0x1373ecb30>,\n",
       " UUID('29afcc91-6a57-4288-bff9-06a48fe15efc'): <mltraq.run.Run at 0x1373ecba0>,\n",
       " UUID('22540eba-a5f7-4e32-83da-b3a116be5ef6'): <mltraq.run.Run at 0x1373ecc10>,\n",
       " UUID('1ce911b4-4acf-40f1-8641-6aea150a8991'): <mltraq.run.Run at 0x1373ecc80>,\n",
       " UUID('68d5414e-619d-4a08-a963-668171e99187'): <mltraq.run.Run at 0x1373eccf0>,\n",
       " UUID('964a30d8-a16a-4038-a60e-bb144344494c'): <mltraq.run.Run at 0x1373ecd60>,\n",
       " UUID('72bc7bd3-77ed-4e41-81a0-749cd922f6d5'): <mltraq.run.Run at 0x1373ecdd0>,\n",
       " UUID('cfe347ac-a1cf-4dfb-9d90-b691a126b789'): <mltraq.run.Run at 0x1373ece40>,\n",
       " UUID('0346bf51-fe45-4308-bc67-6f77d410ece3'): <mltraq.run.Run at 0x1373eceb0>,\n",
       " UUID('7ce3afb3-33a7-42c7-ad63-0764398acab7'): <mltraq.run.Run at 0x1373ecf20>,\n",
       " UUID('2e1a8e76-7f09-4bf8-b863-a66bda27b011'): <mltraq.run.Run at 0x1373ecf90>,\n",
       " UUID('f6f92290-fda2-4bdf-8d5d-0266e7653a76'): <mltraq.run.Run at 0x1373ed000>,\n",
       " UUID('e74381c1-cb29-4a7b-ab74-7e34c7f4dff5'): <mltraq.run.Run at 0x1373ed070>,\n",
       " UUID('0beec71a-c132-4764-8a3f-360998cb33f3'): <mltraq.run.Run at 0x1373ed0e0>,\n",
       " UUID('d750fa67-2e30-49ba-bea9-61eccdffd9f5'): <mltraq.run.Run at 0x1373ed150>,\n",
       " UUID('e6cadeb4-03c9-4a56-915e-2c4597fa9f1c'): <mltraq.run.Run at 0x1373ed1c0>,\n",
       " UUID('d3d7eec5-d11c-4e62-92ba-ce6799108f0c'): <mltraq.run.Run at 0x1373ed230>,\n",
       " UUID('5119efa5-4df2-4393-8cd4-6a6d6f2612ba'): <mltraq.run.Run at 0x1373ed2a0>,\n",
       " UUID('7c05a6c0-77ae-40bc-bb7a-c22282c373b9'): <mltraq.run.Run at 0x1373ed310>,\n",
       " UUID('89d57208-c8be-49b7-895f-874af3f89968'): <mltraq.run.Run at 0x1373ed380>,\n",
       " UUID('5835479e-e136-4092-8a50-770cbf8f466e'): <mltraq.run.Run at 0x1373ed3f0>,\n",
       " UUID('e846f0b7-a336-4e36-8940-e66ca9712b6d'): <mltraq.run.Run at 0x1373ed460>,\n",
       " UUID('c2a61aa5-c168-4963-a4bb-9fd5caf9c75a'): <mltraq.run.Run at 0x1373ed4d0>,\n",
       " UUID('bae3b98b-4858-4d70-ab69-6064898644aa'): <mltraq.run.Run at 0x1373ed540>,\n",
       " UUID('13ea0cdf-3b9d-482c-8a33-44ed0ff46eb1'): <mltraq.run.Run at 0x1373ed5b0>,\n",
       " UUID('a5a65b3b-ec7a-4253-950e-60a97ba85448'): <mltraq.run.Run at 0x1373ed620>,\n",
       " UUID('70d48d50-e55f-41fd-b28c-e889d250658c'): <mltraq.run.Run at 0x1373ed690>,\n",
       " UUID('09eb3e66-990e-4eeb-bedb-bf7624cf4707'): <mltraq.run.Run at 0x1373ed700>,\n",
       " UUID('f33a170d-01ae-468f-8f17-a3382431b86a'): <mltraq.run.Run at 0x1373ed770>,\n",
       " UUID('e32079ed-121f-4783-bc31-a188e049f9cc'): <mltraq.run.Run at 0x1373ed7e0>,\n",
       " UUID('a9563754-1ace-43c9-94ea-7e38f08aa5c2'): <mltraq.run.Run at 0x1373ed850>,\n",
       " UUID('eb10d3fd-d6b0-4007-82f4-c02b7e53507e'): <mltraq.run.Run at 0x1373ed8c0>,\n",
       " UUID('f314771f-ba75-48a2-898c-b3a92f29fc70'): <mltraq.run.Run at 0x1373ed930>,\n",
       " UUID('888a4755-795e-43b6-94b8-8ec0a1f3062a'): <mltraq.run.Run at 0x1373ed9a0>,\n",
       " UUID('ca7b0c29-9ffb-420a-a4a4-8ea1cb425dde'): <mltraq.run.Run at 0x1373eda10>,\n",
       " UUID('39b2c5de-184a-4dab-b901-ea09d899628f'): <mltraq.run.Run at 0x1373eda80>,\n",
       " UUID('fcdc5c9a-6f8a-497c-9823-0dec33c6568d'): <mltraq.run.Run at 0x1373edaf0>,\n",
       " UUID('9c5897e8-18fc-41bb-9f18-6dc920c59308'): <mltraq.run.Run at 0x1373edb60>,\n",
       " UUID('5920c021-177e-4a64-b7fb-f57752c76cc3'): <mltraq.run.Run at 0x1373edbd0>,\n",
       " UUID('c587e7d2-9630-42ad-b152-3b3b9aa500fe'): <mltraq.run.Run at 0x1373edc40>,\n",
       " UUID('aaf010b7-e4c3-4516-befc-4d0d7dbcce27'): <mltraq.run.Run at 0x1373edcb0>,\n",
       " UUID('ac5969b8-40dc-4256-85d8-0776be93d570'): <mltraq.run.Run at 0x1373edd20>,\n",
       " UUID('859f4bc6-181a-45d7-a582-67a8449b88d7'): <mltraq.run.Run at 0x1373edd90>,\n",
       " UUID('587849f0-63db-4e61-87f1-4918e3b952ef'): <mltraq.run.Run at 0x1373ede00>,\n",
       " UUID('6d8710be-5cdd-44b2-8d54-b48501a4768c'): <mltraq.run.Run at 0x1373ede70>,\n",
       " UUID('b8a1ed2f-21d2-4a52-8129-d366efb70d52'): <mltraq.run.Run at 0x1373edee0>,\n",
       " UUID('13bf8486-756e-4eea-aa8c-6ce5636b3477'): <mltraq.run.Run at 0x1373edf50>,\n",
       " UUID('c285256b-91b9-44c3-bd2c-6df94f6c4129'): <mltraq.run.Run at 0x1373edfc0>,\n",
       " UUID('a7f39745-6dac-4185-9999-f0e8332c9108'): <mltraq.run.Run at 0x1373ee030>,\n",
       " UUID('b3326906-4d12-414c-a203-9d5edf3baea6'): <mltraq.run.Run at 0x1373ee0a0>,\n",
       " UUID('d53d50c5-b078-4c8d-9031-b4ea2b390f83'): <mltraq.run.Run at 0x1373ee110>,\n",
       " UUID('cb471bcb-9bc0-4d82-b2ec-748dfbc6c1a9'): <mltraq.run.Run at 0x1373ee180>,\n",
       " UUID('5ece3588-8d0d-4367-94c8-a88209b1e8d4'): <mltraq.run.Run at 0x1373ee1f0>,\n",
       " UUID('9ce591bb-ff5a-43b4-adc1-5c9f66ded839'): <mltraq.run.Run at 0x1373ee260>,\n",
       " UUID('86248579-f6a4-406f-b8ee-33159d7dc30b'): <mltraq.run.Run at 0x1373ee2d0>,\n",
       " UUID('868d4e2d-ed84-4d99-b952-fa3a20a1b18f'): <mltraq.run.Run at 0x1373ee340>,\n",
       " UUID('75967bba-417e-4355-bf45-8ec3b5c1ef18'): <mltraq.run.Run at 0x1373ee3b0>,\n",
       " UUID('be9bc9e1-26cf-4c6a-a2ff-3d051141b080'): <mltraq.run.Run at 0x1373ee420>,\n",
       " UUID('ba42e487-e593-4059-b08b-5845ce7efaf5'): <mltraq.run.Run at 0x1373ee490>}"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import os\n",
    "\n",
    "from mltraq import Run, Sequence, create_experiment\n",
    "\n",
    "\n",
    "def eval_persist(run: Run):\n",
    "    \"\"\"\n",
    "    Measure the time required to persist and load\n",
    "    an experiment with a run holding a blob of\n",
    "    up to 1GB of randomness.\n",
    "    \"\"\"\n",
    "\n",
    "    e = create_experiment()\n",
    "    run.fields.log = Sequence()\n",
    "    e.fields.blob = os.urandom(run.params.n_bytes)\n",
    "\n",
    "    run.fields.log.append(tag=\"a\")\n",
    "    e.persist()\n",
    "    run.fields.log.append(tag=\"b\")\n",
    "    e.reload()\n",
    "    run.fields.log.append(tag=\"c\")\n",
    "\n",
    "    durations = run.fields.log.df().pivot_table(index=\"tag\", values=\"timestamp\")[\"timestamp\"]\n",
    "    run.fields.n_bytes = run.params.n_bytes\n",
    "    run.fields.duration_persist = durations.b - durations.a\n",
    "    run.fields.duration_load = durations.c - durations.b\n",
    "\n",
    "\n",
    "e = create_experiment()\n",
    "\n",
    "# We vary `i` to average on 10 runs per configuration,\n",
    "# the number of written bytes ranges from 10B to 10GB\n",
    "e.add_runs(\n",
    "    i=range(10),\n",
    "    n_bytes=[10**i for i in range(10)],\n",
    ")\n",
    "\n",
    "# Execute experiment, runs executed in foreground\n",
    "e.execute(eval_persist, n_jobs=1)\n",
    "\n",
    "# Overview of runs\n",
    "e.runs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "4fb50cd7-8e7f-4069-8598-1d73811a6cd3",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-02-13T21:07:04.580272Z",
     "iopub.status.busy": "2024-02-13T21:07:04.580087Z",
     "iopub.status.idle": "2024-02-13T21:07:04.591982Z",
     "shell.execute_reply": "2024-02-13T21:07:04.591645Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "n_bytes\n",
       "1            0 days 00:00:00.016416332\n",
       "10           0 days 00:00:00.013118233\n",
       "100          0 days 00:00:00.004926003\n",
       "1000         0 days 00:00:00.004733388\n",
       "10000        0 days 00:00:00.004683724\n",
       "100000       0 days 00:00:00.009184384\n",
       "1000000      0 days 00:00:00.005659980\n",
       "10000000     0 days 00:00:00.017387315\n",
       "100000000    0 days 00:00:00.139188761\n",
       "1000000000   0 days 00:00:01.507990860\n",
       "Name: duration_persist, dtype: timedelta64[ns]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# \"Persist\" elapsed time\n",
    "e.runs.df().groupby(\"n_bytes\").duration_persist.mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "4b4551c8-4f33-4a2d-954b-4db9ff4bdfb6",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-02-13T21:07:04.593913Z",
     "iopub.status.busy": "2024-02-13T21:07:04.593761Z",
     "iopub.status.idle": "2024-02-13T21:07:04.603601Z",
     "shell.execute_reply": "2024-02-13T21:07:04.603280Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "n_bytes\n",
       "1            0 days 00:00:00.001006310\n",
       "10           0 days 00:00:00.000958899\n",
       "100          0 days 00:00:00.000957004\n",
       "1000         0 days 00:00:00.000938931\n",
       "10000        0 days 00:00:00.000966220\n",
       "100000       0 days 00:00:00.001083008\n",
       "1000000      0 days 00:00:00.010405606\n",
       "10000000     0 days 00:00:00.003369011\n",
       "100000000    0 days 00:00:00.059613132\n",
       "1000000000   0 days 00:00:00.809016396\n",
       "Name: duration_load, dtype: timedelta64[ns]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# \"Reload\" elapsed time\n",
    "e.runs.df().groupby(\"n_bytes\").duration_load.mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5ed433c3-67bc-4c7f-922b-10d1ff1c592d",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.6"
  },
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "state": {
     "06c352f1d1fa48e78ce060f130f6d261": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "FloatProgressModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "FloatProgressModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "ProgressView",
       "bar_style": "",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_9af328a2b9c4495b9d9b96baa373de41",
       "max": 100,
       "min": 0,
       "orientation": "horizontal",
       "style": "IPY_MODEL_262eba1c6db24a439e5fc74e131a1487",
       "tabbable": null,
       "tooltip": null,
       "value": 100
      }
     },
     "141b63597b644febab0d40224297e8bf": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_52b8eb86adbe4c5693848aa9b2949c4f",
       "placeholder": "​",
       "style": "IPY_MODEL_4794ba090a25472a87c9d5234572fc30",
       "tabbable": null,
       "tooltip": null,
       "value": " 100/100 [01:01&lt;00:00,  1.63it/s]"
      }
     },
     "262eba1c6db24a439e5fc74e131a1487": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "ProgressStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "bar_color": null,
       "description_width": ""
      }
     },
     "2c996bf07251415e9f2ac15c00a78083": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "4794ba090a25472a87c9d5234572fc30": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "52b8eb86adbe4c5693848aa9b2949c4f": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "6646b8c3cafb4e8684eb4d3e9ee9bd9a": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HBoxModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HBoxModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HBoxView",
       "box_style": "",
       "children": [
        "IPY_MODEL_ff215bcd18b143018e274f6bea9cf806",
        "IPY_MODEL_06c352f1d1fa48e78ce060f130f6d261",
        "IPY_MODEL_141b63597b644febab0d40224297e8bf"
       ],
       "layout": "IPY_MODEL_b4f3e66ea35f4b78b74e0b5b2fd528e1",
       "tabbable": null,
       "tooltip": null
      }
     },
     "718916384cdd4a018234e319f645f4b8": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "9af328a2b9c4495b9d9b96baa373de41": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "b4f3e66ea35f4b78b74e0b5b2fd528e1": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": "hidden",
       "width": null
      }
     },
     "ff215bcd18b143018e274f6bea9cf806": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_2c996bf07251415e9f2ac15c00a78083",
       "placeholder": "​",
       "style": "IPY_MODEL_718916384cdd4a018234e319f645f4b8",
       "tabbable": null,
       "tooltip": null,
       "value": "100%"
      }
     }
    },
    "version_major": 2,
    "version_minor": 0
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
